package concurrent.cas;

import org.junit.Test;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * compare and swap ：比较并设置，它的功能是判断内存某个位置的值是否为预期值，如果是则更改为新的值，这个过程是原子的。
 * <p>
 * CAS并发原语体现在JAVA语言中就是sun.misc.Unsafe类中的各个方法。调用UnSafe类中的CAS方法，JVM会帮我们实现出CAS
 * 汇编指令。这是一种完全依赖于硬件的功能，通过它实现了原子操作。再次强调，由于CAS
 * 是一种系统原语，原语属于操作系统用语范畴，是由若干条指令组成的，用于完成某个功能的一个过程，并且原语的执行必须是连续的，在执行过程中不允许被中断，也就是说CAS是一条CPU
 * 的原子指令，不会造成所谓的数据不一致问题。（原子性）
 */
public class CasAtomicIntegerTest {

	/**
	 * compare and set
	 */
	@Test
	public void compareAndSet() {
		AtomicInteger atomicInteger = new AtomicInteger(5);
		System.out.println(atomicInteger.compareAndSet(5, 100) + " -- 当前值为：" + atomicInteger.get());
		System.out.println(atomicInteger.compareAndSet(5, 200) + " -- 当前值为：" + atomicInteger.get());
	}

	@Test
	public void getAndAddInt() {
		AtomicInteger atomicInteger = new AtomicInteger(5);
		System.out.println("第一次 - getAndAdd - " + atomicInteger.getAndIncrement());
		System.out.println("第一次 - getAndAdd - " + atomicInteger.getAndIncrement());
	}
}
